//
//  HMComposeView.swift
//  Weibo
//
//  Created by itteacher on 2017/7/29.
//  Copyright © 2017年 itteacher. All rights reserved.
//

import UIKit
import pop
import YYModel

//  撰写视图罩层
class HMComposeView: UIView {
    //  目标控制器
    var target: UIViewController?
    //  存储6个撰写按钮
    private lazy var composeButtonArray: [HMComposeButton] = [HMComposeButton]()
    //  撰写菜单模型数组
    private lazy var composeMenuArray: [HMComposeMenu] = {
        let modelArray = self.loadComposePlistData()
        return modelArray
    }()

    //  MARK: --   懒加载控件
    fileprivate lazy var bgImageView: UIImageView = {
        //  获取截屏图片,设置图片模糊效果
        let image = self.getScreenShot().applyLightEffect()
        let imageView = UIImageView(image: image)
        return imageView
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI() {
        self.size = CGSize(width: ScreenWidth, height: ScreenHeight)
        addSubview(bgImageView)
        addChildButton()
        //  执行弹簧动画
        startPopSpringAnimation(isUp: true)
    }
    
    //  添加菜单按钮
    private func addChildButton() {
        //  按钮的宽度
        let buttonWidth: CGFloat = 80
        //  按钮的高度
        let buttonHeight: CGFloat = 110
        //  按钮的间距
        let buttonMargin: CGFloat = (width - 3 * buttonWidth) / 4
        for i in 0..<composeMenuArray.count {
            
            //  列索引
            let colIndex = i % 3
            //  行索引
            let rowIndex = i / 3
            
            let button = HMComposeButton()
            //  设置tag值，目的通过tag值获取对应的模型
            button.tag = i
            //  添加点击事件
            button.addTarget(self, action: #selector(composeButtonActicon(btn:)), for: .touchUpInside)
            //  设置x坐标
            button.x = CGFloat(colIndex) * buttonWidth + CGFloat(colIndex + 1) * buttonMargin
            //  设置y坐标
            button.y = CGFloat(rowIndex) * buttonHeight + CGFloat(rowIndex) * buttonMargin + ScreenHeight
            //  设置大小
            button.size = CGSize(width: buttonWidth, height: buttonHeight)
            //  获取模型
            let model = composeMenuArray[i]
            button.setImage(UIImage(named: model.icon!), for: .normal)
            button.setTitle(model.title!, for: .normal)
            button.titleLabel?.font = UIFont.systemFont(ofSize: 14)
            button.setTitleColor(UIColor.gray, for: .normal)
            addSubview(button)
            //  添加到撰写数组
            composeButtonArray.append(button)
        }
        
        
    }
    
    //  MARK: --    撰写按钮点击事件处理
    @objc private func composeButtonActicon(btn: HMComposeButton) {
    
        UIView.animate(withDuration: 0.25, animations: { 
            
            for button in self.composeButtonArray {
                //  设置按钮的透明度
                button.alpha = 0.3
                if button == btn {
                    //  放大
                    button.transform = CGAffineTransform(scaleX: 2, y: 2)
                } else {
                    //  缩小
                    button.transform = CGAffineTransform(scaleX: 0.3, y: 0.3)
                }
            }
            
            
        }) { (_) in
            
            UIView.animate(withDuration: 0.25, animations: { 
                for button in self.composeButtonArray {
                    //  设置按钮的透明度
                    button.alpha = 1
                    button.transform = CGAffineTransform.identity
                }
            }, completion: { (_) in
                print("弹出发微博界面")
                
                //  通过类名字符串获取类的实例
                //  HMComposeViewController
                //  提示： 自己定义的类获取的对应的类名的时候会有命名空间
//                let className = NSStringFromClass(HMComposeViewController.self)
//                print(className)
                
                
                /*
                    类名字符串转类实例
                    1. 如果是自己定义的类需要加上命名空间
                    2. 获取class类型以后需要把类型AnyClass转换成指定类型
                    3. 使用.init() 构造函数
                 */
                
                //  1. 通过类名获取class， 提示遇到到获取的class为nil，解决办法： 添加上命名空间，系统的类不需要
                //  在使用构造函数的时候，需要转换成指定类型
                //  获取模型
                let model = self.composeMenuArray[btn.tag]
                let classType = NSClassFromString(model.className!) as!  UIViewController.Type
                //  2. 通过class创建实例, 提示： 不能直接使用小括号，需要使用.init()
                let vc = classType.init()
                //  3. 创建导航视图控制器
                let nav = HMNavigationController(rootViewController: vc)
                
                //  弹出控制
                self.target?.present(nav, animated: true, completion: {
                    //  移除当前视图
                    self.removeFromSuperview()
                })
                
                
                
                
                
            })
            
        }
        
    
    }
    
    //  执行弹簧动画
    private func startPopSpringAnimation(isUp: Bool) {
        
        if isUp == false {
            //  向下的pop动画数组反转
            composeButtonArray = composeButtonArray.reversed()
        }
        
        for (i, composeButton) in composeButtonArray.enumerated() {
            //  创建弹簧动画对象，kPOPViewCenter
            let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
            if isUp {
                //  动画目的地
                animation?.toValue = CGPoint(x: composeButton.centerX, y: composeButton.centerY - 350)
            } else {
                //  动画目的地
                animation?.toValue = CGPoint(x: composeButton.centerX, y: composeButton.centerY + 350)
            }
            
            //  设置弹簧系数[0-20] 弹力 越大则震动幅度越大
            animation?.springBounciness = 10
            //  springSpeed 默认值: 12.0  [0-20] 速度 越大则动画结束越快
            animation?.springSpeed = 10
            //  设置动画时间间隔 CACurrentMediaTime: 现在距离开机的时间差
            animation?.beginTime = CACurrentMediaTime() + Double(i) * 0.025
            //  执行弹簧动画
            composeButton.pop_add(animation, forKey: nil)
        }
        
    
    }
    
    
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //  向下的pop动画
        startPopSpringAnimation(isUp: false)
        //  主线程移除视图
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
            self.removeFromSuperview()
        }
    }
    
    //  截屏
    private func getScreenShot() -> UIImage {
        //  获取window
        let window = UIApplication.shared.keyWindow!
        //  1. 开启图片上下文
        UIGraphicsBeginImageContext(window.size)
        //  2. 截屏区域
        let rect = CGRect(origin: CGPoint.zero, size: window.size)
        //  afterScreenUpdates: 不需要更新后进行截屏，因为本身对图片质量要求不高
        //  drawHierarchy: 在指定区域内截取图片
        window.drawHierarchy(in: rect, afterScreenUpdates: false)
        //  3. 在图片上下文中获取图片
        let image = UIGraphicsGetImageFromCurrentImageContext()
        //  4. 结束图片上下文
        UIGraphicsEndImageContext()
        return image!
    }
    
    
    //  显示罩层
    func show(target: UIViewController) {
        //  记录目标控制器
        self.target = target
        //  添加到目标控制器的View
        target.view.addSubview(self)
//        let window = UIApplication.shared.keyWindow!
//        window.addSubview(self)
    }
    
    //  读取plist文件数据
    private func loadComposePlistData() -> [HMComposeMenu] {
        //  plist文件路径
        let path = Bundle.main.path(forResource:"compose.plist", ofType: nil)
        //  加载plist文件数据
        let dicArray = NSArray(contentsOfFile: path!)!
        //  使用YYModel完成字典转模型
        let composeMenuArray = NSArray.yy_modelArray(with: HMComposeMenu.self, json: dicArray) as! [HMComposeMenu]
        return composeMenuArray
    }
}
